package poo.string;
import java.util.*;

public class ValutatoreInterattivo{
	/*
	 * Valutatore interattivo di espressioni aritmetiche intere.
	 * Gli operatori ammessi sono + - * / e sono assunti equiprioritari.
	 * Per recuperare la priorita' degli operatori moltiplicativi (* e /)
	 * rispetto a quelli additivi (+ e -) si possono introdurre sotto espressioni
	 * tra parentesi tonde. Una parentesi e' sempre valutata prima.
	 * Si ignorano i problemi delle espressioni malformate.
	 */
	static int valutaEspressione( StringTokenizer st ){
		int esito=valutaOperando( st );
		while( st.hasMoreTokens() ){
			char op=st.nextToken().charAt(0);
			if( op==')' ) return esito;
			int opnd=valutaOperando( st );
			switch( op ){
			case '+': esito += opnd; break;
			case '-': esito -= opnd; break;
			case '*': esito *= opnd; break;
			default : esito /= opnd;
			}
		}
		return esito;
	}//valutaEspressione
	static int valutaOperando( StringTokenizer st ){
		String tk=st.nextToken();
		if( tk.equals("(") )
			return valutaEspressione(st);
		else
			return Integer.parseInt( tk );
	}//valutaOperando
	public static void main( String... args ){
		System.out.println("Valutatore interattivo di espressioni."+
			       " Inserire . per terminare");
		System.out.println("Operandi interi senza segno. Operatori +-*/()");
		String linea=null;
		Scanner sc=new Scanner( System.in );
		for(;;){
			System.out.print("> ");
			linea=sc.nextLine();
			if( linea.equals(".") ) break;
			StringTokenizer st=new StringTokenizer( linea, "+-*/()", true );
			int ris=valutaEspressione(st);
			System.out.println(linea+"="+ris);
		}
		System.out.println("Bye.");
	}
}//ValutatoreInterattivo
